﻿/*
 Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.md or http://ckeditor.com/license
*/
(function() {
	CKEDITOR.dialog.add("link", function(g) {
		var l = CKEDITOR.plugins.link,
			m = function() {
				var a = this.getDialog(),
					b = a.getContentElement("target", "popupFeatures"),
					a = a.getContentElement("target", "linkTargetName"),
					k = this.getValue();
				if (b && a) switch (b = b.getElement(), b.hide(), a.setValue(""), k) {
				case "frame":
					a.setLabel(g.lang.link.targetFrameName);
					a.getElement().show();
					break;
				case "popup":
					b.show();
					a.setLabel(g.lang.link.targetPopupName);
					a.getElement().show();
					break;
				default:
					a.setValue(k), a.getElement().hide()
				}
			},
			f = function(a) {
				a.target && this.setValue(a.target[this.id] || "")
			},
			h = function(a) {
				a.advanced && this.setValue(a.advanced[this.id] || "")
			},
			i = function(a) {
				a.target || (a.target = {});
				a.target[this.id] = this.getValue() || ""
			},
			j = function(a) {
				a.advanced || (a.advanced = {});
				a.advanced[this.id] = this.getValue() || ""
			},
			c = g.lang.common,
			b = g.lang.link,
			d;
		return {
			title: b.title,
			minWidth: 350,
			minHeight: 230,
			contents: [{
				id: "info",
				label: b.info,
				title: b.info,
				elements: [{
					id: "linkType",
					type: "select",
					label: b.type,
					"default": "url",
					items: [
						[b.toUrl, "url"],
						[b.toAnchor, "anchor"],
						[b.toEmail, "email"]
					],
					onChange: function() {
						var a = this.getDialog(),
							b = ["urlOptions", "anchorOptions", "emailOptions"],
							k = this.getValue(),
							e = a.definition.getContents("upload"),
							e = e && e.hidden;
						"url" == k ? (g.config.linkShowTargetTab && a.showPage("target"), e || a.showPage("upload")) : (a.hidePage("target"), e || a.hidePage("upload"));
						for (e = 0; e < b.length; e++) {
							var c = a.getContentElement("info", b[e]);
							c && (c = c.getElement().getParent().getParent(), b[e] == k + "Options" ? c.show() : c.hide())
						}
						a.layout()
					},
					setup: function(a) {
						this.setValue(a.type || "url")
					},
					commit: function(a) {
						a.type = this.getValue()
					}
				}, {
					type: "vbox",
					id: "urlOptions",
					children: [{
						type: "hbox",
						widths: ["25%", "75%"],
						children: [{
							id: "protocol",
							type: "select",
							label: c.protocol,
							"default": "http://",
							items: [
								["http://‎", "http://"],
								["https://‎", "https://"],
								["ftp://‎", "ftp://"],
								["news://‎", "news://"],
								[b.other, ""]
							],
							setup: function(a) {
								a.url && this.setValue(a.url.protocol || "")
							},
							commit: function(a) {
								a.url || (a.url = {});
								a.url.protocol = this.getValue()
							}
						}, {
							type: "text",
							id: "url",
							label: c.url,
							required: !0,
							onLoad: function() {
								this.allowOnChange = !0
							},
							onKeyUp: function() {
								this.allowOnChange = !1;
								var a = this.getDialog().getContentElement("info", "protocol"),
									b = this.getValue(),
									k = /^((javascript:)|[#\/\.\?])/i,
									c = /^(http|https|ftp|news):\/\/(?=.)/i.exec(b);
								c ? (this.setValue(b.substr(c[0].length)), a.setValue(c[0].toLowerCase())) : k.test(b) && a.setValue("");
								this.allowOnChange = !0
							},
							onChange: function() {
								if (this.allowOnChange) this.onKeyUp()
							},
							validate: function() {
								var a = this.getDialog();
								return a.getContentElement("info", "linkType") && "url" != a.getValueOf("info", "linkType") ? !0 : !g.config.linkJavaScriptLinksAllowed && /javascript\:/.test(this.getValue()) ? (alert(c.invalidValue), !1) : this.getDialog().fakeObj ? !0 : CKEDITOR.dialog.validate.notEmpty(b.noUrl).apply(this)
							},
							setup: function(a) {
								this.allowOnChange = !1;
								a.url && this.setValue(a.url.url);
								this.allowOnChange = !0
							},
							commit: function(a) {
								this.onChange();
								a.url || (a.url = {});
								a.url.url = this.getValue();
								this.allowOnChange = !1
							}
						}],
						setup: function() {
							this.getDialog().getContentElement("info", "linkType") || this.getElement().show()
						}
					}, {
						type: "button",
						id: "browse",
						hidden: "true",
						filebrowser: "info:url",
						label: c.browseServer
					}]
				}, {
					type: "vbox",
					id: "anchorOptions",
					width: 260,
					align: "center",
					padding: 0,
					children: [{
						type: "fieldset",
						id: "selectAnchorText",
						label: b.selectAnchor,
						setup: function() {
							d = l.getEditorAnchors(g);
							this.getElement()[d && d.length ? "show" : "hide"]()
						},
						children: [{
							type: "hbox",
							id: "selectAnchor",
							children: [{
								type: "select",
								id: "anchorName",
								"default": "",
								label: b.anchorName,
								style: "width: 100%;",
								items: [
									[""]
								],
								setup: function(a) {
									this.clear();
									this.add("");
									if (d) for (var b = 0; b < d.length; b++) d[b].name && this.add(d[b].name);
									a.anchor && this.setValue(a.anchor.name);
									(a = this.getDialog().getContentElement("info", "linkType")) && "email" == a.getValue() && this.focus()
								},
								commit: function(a) {
									a.anchor || (a.anchor = {});
									a.anchor.name = this.getValue()
								}
							}, {
								type: "select",
								id: "anchorId",
								"default": "",
								label: b.anchorId,
								style: "width: 100%;",
								items: [
									[""]
								],
								setup: function(a) {
									this.clear();
									this.add("");
									if (d) for (var b = 0; b < d.length; b++) d[b].id && this.add(d[b].id);
									a.anchor && this.setValue(a.anchor.id)
								},
								commit: function(a) {
									a.anchor || (a.anchor = {});
									a.anchor.id = this.getValue()
								}
							}],
							setup: function() {
								this.getElement()[d && d.length ? "show" : "hide"]()
							}
						}]
					}, {
						type: "html",
						id: "noAnchors",
						style: "text-align: center;",
						html: '<div role="note" tabIndex="-1">' + CKEDITOR.tools.htmlEncode(b.noAnchors) + "</div>",
						focus: !0,
						setup: function() {
							this.getElement()[d && d.length ? "hide" : "show"]()
						}
					}],
					setup: function() {
						this.getDialog().getContentElement("info", "linkType") || this.getElement().hide()
					}
				}, {
					type: "vbox",
					id: "emailOptions",
					padding: 1,
					children: [{
						type: "text",
						id: "emailAddress",
						label: b.emailAddress,
						required: !0,
						validate: function() {
							var a = this.getDialog();
							return !a.getContentElement("info", "linkType") || "email" != a.getValueOf("info", "linkType") ? !0 : CKEDITOR.dialog.validate.notEmpty(b.noEmail).apply(this)
						},
						setup: function(a) {
							a.email && this.setValue(a.email.address);
							(a = this.getDialog().getContentElement("info", "linkType")) && "email" == a.getValue() && this.select()
						},
						commit: function(a) {
							a.email || (a.email = {});
							a.email.address = this.getValue()
						}
					}, {
						type: "text",
						id: "emailSubject",
						label: b.emailSubject,
						setup: function(a) {
							a.email && this.setValue(a.email.subject)
						},
						commit: function(a) {
							a.email || (a.email = {});
							a.email.subject = this.getValue()
						}
					}, {
						type: "textarea",
						id: "emailBody",
						label: b.emailBody,
						rows: 3,
						"default": "",
						setup: function(a) {
							a.email && this.setValue(a.email.body)
						},
						commit: function(a) {
							a.email || (a.email = {});
							a.email.body = this.getValue()
						}
					}],
					setup: function() {
						this.getDialog().getContentElement("info", "linkType") || this.getElement().hide()
					}
				}]
			}, {
				id: "target",
				requiredContent: "a[target]",
				label: b.target,
				title: b.target,
				elements: [{
					type: "hbox",
					widths: ["50%", "50%"],
					children: [{
						type: "select",
						id: "linkTargetType",
						label: c.target,
						"default": "notSet",
						style: "width : 100%;",
						items: [
							[c.notSet, "notSet"],
							[b.targetFrame, "frame"],
							[b.targetPopup, "popup"],
							[c.targetNew, "_blank"],
							[c.targetTop, "_top"],
							[c.targetSelf, "_self"],
							[c.targetParent, "_parent"]
						],
						onChange: m,
						setup: function(a) {
							a.target && this.setValue(a.target.type || "notSet");
							m.call(this)
						},
						commit: function(a) {
							a.target || (a.target = {});
							a.target.type = this.getValue()
						}
					}, {
						type: "text",
						id: "linkTargetName",
						label: b.targetFrameName,
						"default": "",
						setup: function(a) {
							a.target && this.setValue(a.target.name)
						},
						commit: function(a) {
							a.target || (a.target = {});
							a.target.name = this.getValue().replace(/\W/gi, "")
						}
					}]
				}, {
					type: "vbox",
					width: "100%",
					align: "center",
					padding: 2,
					id: "popupFeatures",
					children: [{
						type: "fieldset",
						label: b.popupFeatures,
						children: [{
							type: "hbox",
							children: [{
								type: "checkbox",
								id: "resizable",
								label: b.popupResizable,
								setup: f,
								commit: i
							}, {
								type: "checkbox",
								id: "status",
								label: b.popupStatusBar,
								setup: f,
								commit: i
							}]
						}, {
							type: "hbox",
							children: [{
								type: "checkbox",
								id: "location",
								label: b.popupLocationBar,
								setup: f,
								commit: i
							}, {
								type: "checkbox",
								id: "toolbar",
								label: b.popupToolbar,
								setup: f,
								commit: i
							}]
						}, {
							type: "hbox",
							children: [{
								type: "checkbox",
								id: "menubar",
								label: b.popupMenuBar,
								setup: f,
								commit: i
							}, {
								type: "checkbox",
								id: "fullscreen",
								label: b.popupFullScreen,
								setup: f,
								commit: i
							}]
						}, {
							type: "hbox",
							children: [{
								type: "checkbox",
								id: "scrollbars",
								label: b.popupScrollBars,
								setup: f,
								commit: i
							}, {
								type: "checkbox",
								id: "dependent",
								label: b.popupDependent,
								setup: f,
								commit: i
							}]
						}, {
							type: "hbox",
							children: [{
								type: "text",
								widths: ["50%", "50%"],
								labelLayout: "horizontal",
								label: c.width,
								id: "width",
								setup: f,
								commit: i
							}, {
								type: "text",
								labelLayout: "horizontal",
								widths: ["50%", "50%"],
								label: b.popupLeft,
								id: "left",
								setup: f,
								commit: i
							}]
						}, {
							type: "hbox",
							children: [{
								type: "text",
								labelLayout: "horizontal",
								widths: ["50%", "50%"],
								label: c.height,
								id: "height",
								setup: f,
								commit: i
							}, {
								type: "text",
								labelLayout: "horizontal",
								label: b.popupTop,
								widths: ["50%", "50%"],
								id: "top",
								setup: f,
								commit: i
							}]
						}]
					}]
				}]
			}, {
				id: "upload",
				label: b.upload,
				title: b.upload,
				hidden: !0,
				filebrowser: "uploadButton",
				elements: [{
					type: "file",
					id: "upload",
					label: c.upload,
					style: "height:40px",
					size: 29
				}, {
					type: "fileButton",
					id: "uploadButton",
					label: c.uploadSubmit,
					filebrowser: "info:url",
					"for": ["upload", "upload"]
				}]
			}, {
				id: "advanced",
				label: b.advanced,
				title: b.advanced,
				elements: [{
					type: "vbox",
					padding: 1,
					children: [{
						type: "hbox",
						widths: ["45%", "35%", "20%"],
						children: [{
							type: "text",
							id: "advId",
							requiredContent: "a[id]",
							label: b.id,
							setup: h,
							commit: j
						}, {
							type: "select",
							id: "advLangDir",
							requiredContent: "a[dir]",
							label: b.langDir,
							"default": "",
							style: "width:110px",
							items: [
								[c.notSet, ""],
								[b.langDirLTR, "ltr"],
								[b.langDirRTL, "rtl"]
							],
							setup: h,
							commit: j
						}, {
							type: "text",
							id: "advAccessKey",
							requiredContent: "a[accesskey]",
							width: "80px",
							label: b.acccessKey,
							maxLength: 1,
							setup: h,
							commit: j
						}]
					}, {
						type: "hbox",
						widths: ["45%", "35%", "20%"],
						children: [{
							type: "text",
							label: b.name,
							id: "advName",
							requiredContent: "a[name]",
							setup: h,
							commit: j
						}, {
							type: "text",
							label: b.langCode,
							id: "advLangCode",
							requiredContent: "a[lang]",
							width: "110px",
							"default": "",
							setup: h,
							commit: j
						}, {
							type: "text",
							label: b.tabIndex,
							id: "advTabIndex",
							requiredContent: "a[tabindex]",
							width: "80px",
							maxLength: 5,
							setup: h,
							commit: j
						}]
					}]
				}, {
					type: "vbox",
					padding: 1,
					children: [{
						type: "hbox",
						widths: ["45%", "55%"],
						children: [{
							type: "text",
							label: b.advisoryTitle,
							requiredContent: "a[title]",
							"default": "",
							id: "advTitle",
							setup: h,
							commit: j
						}, {
							type: "text",
							label: b.advisoryContentType,
							requiredContent: "a[type]",
							"default": "",
							id: "advContentType",
							setup: h,
							commit: j
						}]
					}, {
						type: "hbox",
						widths: ["45%", "55%"],
						children: [{
							type: "text",
							label: b.cssClasses,
							requiredContent: "a(cke-xyz)",
							"default": "",
							id: "advCSSClasses",
							setup: h,
							commit: j
						}, {
							type: "text",
							label: b.charset,
							requiredContent: "a[charset]",
							"default": "",
							id: "advCharset",
							setup: h,
							commit: j
						}]
					}, {
						type: "hbox",
						widths: ["45%", "55%"],
						children: [{
							type: "text",
							label: b.rel,
							requiredContent: "a[rel]",
							"default": "",
							id: "advRel",
							setup: h,
							commit: j
						}, {
							type: "text",
							label: b.styles,
							requiredContent: "a{cke-xyz}",
							"default": "",
							id: "advStyles",
							validate: CKEDITOR.dialog.validate.inlineStyle(g.lang.common.invalidInlineStyle),
							setup: h,
							commit: j
						}]
					}]
				}]
			}],
			onShow: function() {
				var a = this.getParentEditor(),
					b = a.getSelection(),
					c = null;
				(c = l.getSelectedLink(a)) && c.hasAttribute("href") ? b.getSelectedElement() || b.selectElement(c) : c = null;
				a = l.parseLinkAttributes(a, c);
				this._.selectedElement = c;
				this.setupContent(a)
			},
			onOk: function() {
				var a = {};
				this.commitContent(a);
				var b = g.getSelection(),
					c = l.getLinkAttributes(g, a);
				if (this._.selectedElement) {
					var e = this._.selectedElement,
						d = e.data("cke-saved-href"),
						f = e.getHtml();
					e.setAttributes(c.set);
					e.removeAttributes(c.removed);
					if (d == f || "email" == a.type && -1 != f.indexOf("@")) e.setHtml("email" == a.type ? a.email.address : c.set["data-cke-saved-href"]), b.selectElement(e);
					delete this._.selectedElement
				} else b = b.getRanges()[0], b.collapsed && (a = new CKEDITOR.dom.text("email" == a.type ? a.email.address : c.set["data-cke-saved-href"], g.document), b.insertNode(a), b.selectNodeContents(a)), c = new CKEDITOR.style({
					element: "a",
					attributes: c.set
				}), c.type = CKEDITOR.STYLE_INLINE, c.applyToRange(b, g), b.select()
			},
			onLoad: function() {
				g.config.linkShowAdvancedTab || this.hidePage("advanced");
				g.config.linkShowTargetTab || this.hidePage("target")
			},
			onFocus: function() {
				var a = this.getContentElement("info", "linkType");
				a && "url" == a.getValue() && (a = this.getContentElement("info", "url"), a.select())
			}
		}
	})
})();
